> import Data.Char

> type NegaBinary = String

kovertiert negabinary in dezimalzahl um

> negaBinaryToDecimal nb = sum $ zipWith (*) coeffs negBinPowers
>   where
>     l = length nb
>     negBinPowers = [(-2)^i | i <- [(l-1),(l-2)..0]]
>     coeffs = map (\x -> (ord x) - (ord '0')) nb


konvertiert dezimalzahl in negabinary um

> decimalToNegaBinary' n
>   | n == 0 = []
>   | r < 0  = decimalToNegaBinary' (q+1) ++ show (r+2)
>   | r >= 0 = decimalToNegaBinary' q ++ show r
>   where
>     r = n `mod` (-2)
>     q = n `div` (-2)

> decimalToNegaBinary n
>   | n == 0 = "0"
>   | otherwise = decimalToNegaBinary' n


extrahiert aus gegebnem String die negaBinary zahl aus

> extract :: String -> NegaBinary
> extract s = dropWhile (\x -> x == '0') filtered
>   where
>     filtered = filter (\x -> x == '0' || x == '1') s


Arithmetische Operatioen mit negaBinary Zahlen
Einfacherheitshalber konvertieren wir die gegeben Zahlen zuerst
in Dezimalzahlen um, fuehren die arithmetischen Operationen im Dezimalsystem
aus und konvertieren anschliessend das Ergebnis zurueck in NegaBinarySystem

> nbIncr :: NegaBinary -> NegaBinary
> nbIncr nb = decimalToNegaBinary $ 1 + (negaBinaryToDecimal nb)

> nbDecr :: NegaBinary -> NegaBinary
> nbDecr nb = decimalToNegaBinary $ (negaBinaryToDecimal nb) - 1

> nbAbs :: NegaBinary -> NegaBinary
> nbAbs nb = decimalToNegaBinary $ abs (negaBinaryToDecimal nb)

> isNegative :: NegaBinary -> Bool
> isNegative nb = even $ length nb

> nbPlus :: NegaBinary -> NegaBinary -> NegaBinary
> nbPlus nb1 nb2
>   | nb1 == "0" = nb2
>   | isNegative nb1 = nbPlus (nbIncr nb1) (nbDecr nb2)
>   | otherwise = nbPlus (nbDecr nb1) (nbIncr nb2)

To code this function recursively would be too tedious, if
we want to consider negative arguments

> nbTimes :: NegaBinary -> NegaBinary -> NegaBinary
> nbTimes nb1 nb2 = decimalToNegaBinary $
>                   (negaBinaryToDecimal nb1) * (negaBinaryToDecimal nb2)
